/*
 * super 关键字
 */

public class test11_14_3 {
    public static void main(String[] args) {
        new ChildClass().f();
        new ChildClass_1();
    }
}

class FatherClass{
    public int value;
    public void f(){
        value = 100;
        System.out.println("FatherClass.value = " + value);
    }

    public FatherClass(){
        System.out.println("set FatherClass");
    }
}

class ChildClass extends FatherClass{
    public int value;
    public int age;
    public void f(){        // 重写父类的方法
        super.f();          // 调用父类的方法
        value = 200;
        System.out.println("ChildClass.value = " + value);
        System.out.println("super.value = " + super.value);     // 调用父类的成员变量
    }
}

class ChildClass_1 extends FatherClass{
    public ChildClass_1(){
        System.out.println("set childClass_1");
    }
}


/*
 * 学习笔记:
 * super 关键字：
 * 1. super 关键字用于访问父类中的成员变量和方法
 * 2. super 关键字只能在子类中使用，不能在普通类中使用
 * 
 * 调用父类的普通方法顺序是： 先调用父类的构造方法，再调用父类的普通方法
 * 
 * 继承树的追溯： 
 * 1.子类对象调用父类的方法，如果父类没有该方法，则继续向上追溯，直到找到该方法为止
 * 
 * 构造方法调用顺序：
 * 1.子类对象创建时，先调用父类的构造方法，再调用子类的构造方法
 * 2.子类对象创建时，如果父类没有无参构造方法，则需要在子类的构造方法中显式调用父类的有参构造方法
 * 
 * 静态初始化块调用顺序：
 * 1.子类对象创建时，先调用父类的静态初始化块，再调用子类的静态初始化块
 * 2.静态初始化块只会在类加载时执行一次
 * 
 * 属性查找顺序：
 * 1.子类对象调用属性时，先查找子类中是否有该属性，如果有则直接使用，如果没有则向上追溯，直到找到该属性为止
 */
